class Solution {
public:
   bool canJump(vector<int>& nums) {
    int n = nums.size();
    vector<int> dp(n, 0); // dp[i] 表示从起点出发最多能到达的位置
    dp[0] = nums[0]; // 初始化

    for (int i = 1; i < n; ++i) { // 从索引1开始遍历
        if (dp[i - 1] < i) return false; // 如果前一个位置不能跳到当前位置，则直接返回false
        dp[i] = max(dp[i - 1], i + nums[i]); // 更新最远可以到达的位置
    }

    return dp[n - 1] >= n - 1; // 判断最后一个位置是否可达
}
};
